package com.design.patterns.list.composite;

import java.util.List;

/**
 * component
 * 根节点
 * 组合模式中的顶层抽象类，规定子节点需要使用到的通过方法。
 * 封装相同的属性操作
 * 是组合模式中对象声明接口，在适当情况下实现共有的接口默认行为，用于访问和管理其子部件，component可以是抽象类和接口
 * +addNode
 * +removeNode
 * +operation
 * +getChild
 * @author Wangzhiwen
 */
public abstract class OrganizationComponent {

    // 默认的行为及属性
    private String name;
    private String desc;

    public OrganizationComponent() {
    }

    public OrganizationComponent(String name, String desc) {
        this.name = name;
        this.desc = desc;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    // 节点方法，由于叶子节点需要实现的方法无需节点的添加和移除。这里可以写一个默认的实现，这样叶子节点就不需要强制重写了
    protected void add(OrganizationComponent component){
        throw new RuntimeException("叶子结点无添加节点的行为");
    }
    protected void remove(OrganizationComponent component){
        throw new RuntimeException("叶子结点无移除节点的行为");
    }
    protected List<OrganizationComponent> getChild(){
        throw new RuntimeException("叶子结点获取子节点的行为");
    }

    // 需要子部件具体实现的行为
    protected abstract void operation();
}
